package br.sgd.controller;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.faces.model.SelectItem;
import javax.servlet.http.HttpServletResponse;

import org.richfaces.event.UploadEvent;
import org.richfaces.model.UploadItem;

import br.sgd.model.beans.Documento;
import br.sgd.model.beans.Usuario;
import br.sgd.model.bo.DocumentoBo;
import br.sgd.model.bo.UsuarioBo;

public class DocumentoController {
	
	private Documento documento;
	
	private List<Documento> documentos;
	
	private List<SelectItem> listaUsuarios;
	
	public DocumentoController(){
		this.documento = new Documento();
		this.documentos = new ArrayList<Documento>();	
		this.listaUsuarios = getListaUsuarios();
	}
	
	public String listar() {
		DocumentoBo documentoBo = new DocumentoBo();
		this.documentos = documentoBo.listarTodos();
		this.documento = new Documento();
		return "listarDocumentos";
	}
	
	public String incluir() {
		this.documento = new Documento();
		return "incluirDocumento";
	}
	
	public void filtrar(ActionEvent event){
		DocumentoBo documentoBo = new DocumentoBo();
		this.documentos = documentoBo.filtrar(documento);
	}
	
	public List<SelectItem> getListaUsuarios() {
		ArrayList<SelectItem> lista = new ArrayList<SelectItem>();
		UsuarioBo usuarioBo = new UsuarioBo();
		List<Usuario> usuarios = (List<Usuario>) usuarioBo.listarTodos();

		for (Usuario usuario : usuarios) {
			SelectItem item = new SelectItem(usuario.getUsuario(), usuario.getUsuario());
			lista.add(item);
		}
		return lista;
	}

	public void upload(UploadEvent event) throws Exception {
		FacesContext fc = FacesContext.getCurrentInstance();
		if(documento.getUsuario() == null || documento.getUsuario().isEmpty()){
			FacesMessage msg = new FacesMessage("Selecione um usuário para fazer upload de arquivo!");
			msg.setSeverity(FacesMessage.SEVERITY_ERROR);
			fc.addMessage(null, msg);
		}else{
			try{  
				UploadItem upload = event.getUploadItem();  
				String nomeArquivo = upload.getFileName();
				
				
				documento.setData(new Date());
				documento.setNome(nomeArquivo);
				documento.setTamanho(upload.getFile().length());

				DocumentoBo documentoBo = new DocumentoBo();
				documentoBo.salvar(documento);

				String caminho = "d:\\uploads\\" + documento.getIdDocumento();
				File arquivoUpload = new File(caminho);  

				InputStream in = new FileInputStream(upload.getFile());  
				OutputStream out = new FileOutputStream(arquivoUpload);  
				byte[] buf = new byte[1024];  
				int len;  
				while ((len = in.read(buf)) > 0) {  
					out.write(buf, 0, len);  
				}  
				in.close();  

				out.close();  
				
			}catch (Exception e) {
				FacesMessage msg = new FacesMessage("Ocorreu um erro ao tentar gravar arquivo!");
				msg.setSeverity(FacesMessage.SEVERITY_INFO);
				fc.addMessage(null, msg);
			}  
		}

	}
	
	
	public String download(){
		FacesContext fc = FacesContext.getCurrentInstance();
		ExternalContext context = fc.getExternalContext(); // Context  
        String path = "d:\\uploads\\"; // Localizacao do arquivo  
        String fullFileName = path + documento.getIdDocumento();  
        File file = new File(fullFileName); // Objeto arquivo mesmo :)  
  
        HttpServletResponse response = (HttpServletResponse) context.getResponse();  
        response.setHeader("Content-Disposition", "attachment;filename=\"" + documento.getNome() + "\""); //aki eu seto o header e o nome q vai aparecer na hr do donwload  
        response.setContentLength((int) file.length()); // O tamanho do arquivo
        
        response.setContentType("application/octet-stream");
  
        try {  
            FileInputStream in = new FileInputStream(file);  
            OutputStream out = response.getOutputStream();  
  
            byte[] buf = new byte[(int)file.length()];  
            int count;  
            while ((count = in.read(buf)) >= 0) {  
                out.write(buf, 0, count);  
            }  
            in.close();  
            out.flush();  
            out.close();  
        fc.responseComplete();  
        } catch (IOException ex) {  
			FacesMessage msg = new FacesMessage("Ocorreu um erro ao tentar fazer download de arquivo!");
			msg.setSeverity(FacesMessage.SEVERITY_INFO);
			fc.addMessage(null, msg);
        }  
        return null;
    }  
		
	public String excluir(){
		DocumentoBo documentoBo = new DocumentoBo();
		FacesContext context = FacesContext.getCurrentInstance();
		try {
			documentoBo.excluir(this.documento);
			this.documentos = documentoBo.listarTodos();
			FacesMessage msg = new FacesMessage("Documento excluído com sucesso!");
			msg.setSeverity(FacesMessage.SEVERITY_INFO);
			context.addMessage(null, msg);
			File file = new File("d:\\uploads\\"+documento.getIdDocumento());    
			file.delete(); 
		} catch (Exception e) {
			e.printStackTrace();
			FacesMessage msg = new FacesMessage("Erro inesperado ao excluir documento!");
			msg.setSeverity(FacesMessage.SEVERITY_ERROR);
			context.addMessage(null, msg);
		} 
		documento = new Documento();
		return null;
	}
		
	public Documento getDocumento() {
		return documento;
	}

	public void setDocumento(Documento documento) {
		this.documento = documento;
	}

	public List<Documento> getDocumentos() {
		return documentos;
	}

	public void setDocumentos(List<Documento> documentos) {
		this.documentos = documentos;
	}


}
